const app = getApp();
const db = wx.cloud.database();
const $ = db.command.aggregate;

/**
 * 登录方法
 *  再需要登录才能使用的页面或者功能的地方使用
 * loginedCallBack
 * 	回调函数
 * 		无论是否登录还是登陆后都会执行回调函数，除非从未登录过，需要挑战到新的页面中
 */
function needLogin(pagePath, loginedCallBack = () => {}) {
	// 判断是否登录
	if (!app.globalData._openid) {
		// 没有登录
		wx.showToast({
			title: '未登录',
			duration: 800
		})
		// 检查本地缓存中是否有用户信息
		// 如果用户信息存在，就不查询数据库了，直接从本地拉去数据
		wx.getStorage({
			key: 'userinfo',
		}).then((res) => {
			// 本地缓存中存在用户信息
			// 将数据 存入全局
			app.globalData._id = res.data._id
			app.globalData._openid = res.data._openid
			app.globalData.showHistory = res.data.showHistory
			app.globalData.name = res.data.nickName
			app.globalData.gender = res.data.gender ? "男" : "女"
			app.globalData.college = res.data.college
			app.globalData.sign = res.data.sign
			app.globalData.img = res.data.avatarUrl
			app.globalData.wxId = res.data.wxId
			// 登录ok
			wx.showToast({
				title: '自动登录成功',
				duration: 800
			})
			loginedCallBack(res)
		}).catch((e) => {
			// 本地缓存不存在 用户信息
			// 检查此用户是否在数据库中
			// 如果在数据库中，就从数据库中拉去数据
			// 通过云函数加载用户openid
			wx.cloud.callFunction({
				name: "login",
				success: function (e) {
					// 用户openid
					let userOpenid = e.result.openid;
					// 检查数据库中是否已经存在
					db.collection("users").where({
						_openid: userOpenid,
					}).get().then((e) => {
						// 如果查到数据
						if (e.data.length > 0) {
							// 将数据加载到全部变量
							let res = e.data[0];
							app.globalData._id = res._id
							app.globalData._openid = res._openid
							app.globalData.showHistory = res.showHistory
							app.globalData.name = res.nickName
							app.globalData.gender = res.gender ? "男" : "女"
							app.globalData.college = res.college
							app.globalData.sign = res.sign
							app.globalData.img = res.avatarUrl
							app.globalData.wxId = res.wxId
							// 将数据加入到本地缓存中
							wx.setStorage({
								data: {
									...res
								},
								key: 'userinfo',
							})
							// 登录完成
							wx.showToast({
								title: '自动登录成功',
								duration: 800
							})
							loginedCallBack(res);
						} else {
							// 确实未登录过 显示按钮 让用户登录
							wx.navigateTo({
								url: '/pages/login/login',
							})
						}
					})
				},
				fail: function (e) {
					console.log(e)
				}
			})
		})
	} else {
		// 已经登录
		loginedCallBack()
	}
}

function uploadFiles(files, cloudFloder, callback = () => {}) {
	let arr = [];
	let promiseArr = [];
	for (f of files) {
		let p = new Promise((resolve, reject) => {
			//当第三方api提供的是异步方法时  上传文件获取结果
			let tmp = f.split("/")
			let suffix = tmp[tmp.length - 1]
			let cloudPathName = cloudFloder + "/" + app.globalData._id + '/' + new Date().getTime() + suffix;
			wx.cloud.uploadFile({
				cloudPath: cloudPathName,
				filePath: f
			}).then(res => {
				arr.push(res.fileID)
				resolve()
			}).catch(err => {
				reject(err)
			})
		})
		promiseArr.push(p)
	}
	//等所有promise任务执行完毕后再执行 返回0 1 2 [0,1,2] 
	Promise.all(promiseArr).then(res => {
		callback(arr)
	})
}

/**
 * 根据字段名称 更新本地缓存
 */
function bynameUpdate(name, content) {
	let namepath = name.split(".")
	let tmp = wx.getStorageSync(namepath[0])
	tmp[namepath[1]] = content
	return wx.setStorageSync(namepath[0], tmp)
}
/**
 * 刷新全局的个人信息
 */
function RefreshSelfInfo(callback = () => {}) {
	db.collection("users").doc(app.globalData._id).get()
		.then(res => {
			let userinfo = res.data;
			// 将数据加载到全部变量
			app.globalData._id = userinfo._id
			app.globalData._openid = userinfo._openid
			app.globalData.showHistory = userinfo.showHistory
			app.globalData.name = userinfo.nickName
			app.globalData.gender = userinfo.gender ? "男" : "女"
			app.globalData.college = userinfo.college
			app.globalData.sign = userinfo.sign
			app.globalData.img = userinfo.avatarUrl
			app.globalData.wxId = userinfo.wxId
			// 将数据加入到本地缓存中
			wx.setStorage({
				data: {
					...userinfo
				},
				key: 'userinfo',
			})
			callback()
		})
		.catch(err => {
			wx.showToast({
				title: '刷新失败',
				duration: 500
			})
			console.log(err)
		})
}

function dateFormat(fmt, date) {
	let ret;
	const opt = {
		"Y+": date.getFullYear().toString(), // 年
		"m+": (date.getMonth() + 1).toString(), // 月
		"d+": date.getDate().toString(), // 日
		"H+": date.getHours().toString(), // 时
		"M+": date.getMinutes().toString(), // 分
		"S+": date.getSeconds().toString() // 秒
		// 有其他格式化字符需求可以继续添加，必须转化成字符串
	};
	for (let k in opt) {
		ret = new RegExp("(" + k + ")").exec(fmt);
		if (ret) {
			fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
		};
	};
	return fmt;
}


function goBack() { // 返回上一级, 如果没有上一级则跳转首页
	let pages = getCurrentPages(); //当前页面

	if (pages.length > 1) {
		let beforePage = pages[pages.length - 2]; //前一页
		wx.navigateBack({
			success: function () {
				beforePage.onLoad(); // 执行前一个页面的onLoad方法
			}
		});
	} else {
		wx.redirectTo({
			url: '/pages/index/index'
		})
	}
}


function PageJump(url, key = 1, value = 1) { // 页面跳转, 简单传参
	wx.navigateTo({
		url: '/pages/' + url + '/index' + '?' + key + '=' + value
	});
}
/**
 * 获取此人的获赞数量
 * @param {openid} openid
 */
function getPraiseNum(openid, callback=()=>{}){
	wx.cloud.callFunction({
		name: "operation",
		data:{
			function: "getPraiseNumByOpenid",
			otheropenid: openid
		}
	}).then(res=>{
		let num = res.result.list[0].count;
		callback(num)
	}).catch(err=>{
		console.log(err)
	})
}

/**
 * 获取上传数量
 * @param {openid} openid 
 */
function getUploadNum(openid, callback=()=>{}){
	wx.cloud.callFunction({
		name: "operation",
		data:{
			function: "getUploadNumByOpenid",
			otheropenid: openid
		}
	}).then(res=>{
		let num = res.result.list[0].count;
		callback(num)
	}).catch(err=>{
		console.log(err)
	})
}


/**I
 * 评论文章
 * */
function ToComment(comment, articleId, callback=()=>{}) {
	db.collection("comments").add({
		data:{
			articleId:articleId,
			comment: comment,
			time: new Date(),
			isread: false,		// 表示用户是否已经查看此评论信息
			timestamp: new Date().getTime(),
		}
	}).then(res=>{
		callback(res)
	}).catch(err=>{
		console.log(err)
		callback(res)
	})
}

// 敏感词汇 替换 
function tactful(text){
	// 区分大小写
	let words = ["sb", "SB", "草泥马"]
	let result = text
	for (const word of words) {
		if(result.indexOf(word) >= 0){
			result = result.replaceAll(word, "***")
		}
	}
	return result;
}


export {
	needLogin,
	uploadFiles,
	bynameUpdate,
	RefreshSelfInfo,
	/**
	 * 时间格式化
	 * 	dateFormat("YYYY-mm-dd HH:MM:SS", new Date().getTime())
	 *  >>> 2019-06-06 19:45`
	 */
	dateFormat,
	goBack,
	PageJump,
	getPraiseNum,
	getUploadNum,
	ToComment,
	tactful
}